package gestionParcours;

import modele.Bd;
import modele.BdImpl;

import serveur.Serveur;
import serveur.ServeurImpl;

import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;

import java.io.File;

public class GestionParcours extends JPanel implements ActionListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = 2L;
	// La fenetre principale
	private JFrame frame                = null;
	// Diverses fenetres
	private JPanel parcoursAffiche     = null;
	private JPanel uniteEnseignementAffiche     = null;
	private JPanel uniteEnseignementMaj     = null;

	// La barre de menus
	private JMenuBar menuBar = null;
	//les menusitem
	private JMenuItem save = null;
	private JMenuItem restore = null;
	private JMenuItem restoreold = null;
	private JMenuItem newbase = null;
	private JMenuItem importApoflux=null;
	private JMenuItem show_nb_clients=null;
	private JMenuItem quit = null;
	private JMenuItem parcourspdf=null, parcourssynthesepdf=null, UEsdetails=null, UEssynthese=null;
	private JMenuItem mails=null, mails_suivants=null, relance_coupons=null;
	private JMenuItem deldos=null, razdos=null;
	private JMenuItem affect=null, new_affect=null;
	private JMenuItem stat=null, demandes=null, evaluations=null, propositions=null;
	private JMenuItem courriers=null, courriers_suivants=null;
	
	// La base de donnees de l'application
	private Bd bd     = null;

	// Cette application joue le role du serveur
	private Serveur serveur;

	public GestionParcours()  {
		try {
			serveur = new ServeurImpl("5000");
			bd = new BdImpl();
			serveur.setBd(bd);
		}
		catch(Exception e){
			e.printStackTrace();
			System.exit(0);
		}

		frame = new JFrame("Gestion des parcours Master");
		setLayout(new BorderLayout());

		JPanel top = new JPanel();
		top.setLayout(new BorderLayout());
		add(top, BorderLayout.NORTH);
		createMenus();
		top.add(menuBar, BorderLayout.NORTH);

		// put Appli in a frame and show it
		frame.getContentPane().add(this, BorderLayout.CENTER);
		frame.pack();
		frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		frame.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				if(saveBd())
					System.exit(0);
			}
			public void windowOpened(WindowEvent e) {
				File bd = new File(BdImpl.BACKUPDIR+BdImpl.DEFAULTBACKUPFILE);
				if(bd.exists()) {
					int res = JOptionPane.showConfirmDialog(frame,"Voulez-vous charger la dernière sauvegarde ?","Chargement",JOptionPane.YES_NO_CANCEL_OPTION);
					if (res == JOptionPane.YES_OPTION) {
						try {
							restaurerBd();
						}
						catch(Exception ex){
							JOptionPane.showMessageDialog(frame,ex.getMessage(),"Restauration IMPOSSIBLE : Attention",JOptionPane.ERROR_MESSAGE);
						}
					}
				}
			}
		} );
		
		  // make the frame half the height and width
	    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
	    int height = screenSize.height;
	    int width = screenSize.width;
	    frame.setSize(width/2, height/2);

		 // center the jframe on screen
	    frame.setLocationRelativeTo(null);

		frame.setVisible(true);
	}

	public JFrame  getFrame()                   {return frame;}
	public JPanel  getParcoursAffiche()         {return parcoursAffiche;}
	public JPanel  getUniteEnseignementAffiche() {return uniteEnseignementAffiche;}
	public JPanel  getUniteEnseignementMaj()    {return uniteEnseignementMaj;}
	public Bd      getBd()     {return bd;}

	// implementation de GestionBD
	private void newBase() {
		if (JOptionPane.OK_OPTION == JOptionPane.showConfirmDialog(this,"Les données actuelles vont être remplacées par une nouvelle base vide","Création : Attention",JOptionPane.OK_CANCEL_OPTION)) {
			try {
				bd.Clear();
			} catch (Exception ex) {
				ex.printStackTrace();
				JOptionPane.showMessageDialog(this,ex.getMessage(),"Création IMPOSSIBLE : Attention",JOptionPane.ERROR_MESSAGE);
			}
		}
	}

	private void restaurerBd()  {
		if (JOptionPane.OK_OPTION == JOptionPane.showConfirmDialog(this,"Les données actuelles vont être\n"+"remplacées par celles enregistrées\n"+"par la derniere commande de sauvegarde","Restauration : Attention",JOptionPane.OK_CANCEL_OPTION)) {
			try {
				bd = BdImpl.Restaure();
				serveur.setBd(bd);
			} catch (Exception ex) {
				ex.printStackTrace();
				JOptionPane.showMessageDialog(this,ex.getMessage(),"Restauration IMPOSSIBLE : Attention",JOptionPane.ERROR_MESSAGE);
			}
		}
	}
	private void restaurerBd(String file) {
		try {
			bd = BdImpl.Restaure(file);
			serveur.setBd(bd);
		} catch (Exception ex) {
			ex.printStackTrace();
			JOptionPane.showMessageDialog(this,ex.getMessage(),"Restauration IMPOSSIBLE : Attention",JOptionPane.ERROR_MESSAGE);
		}
	}

	private boolean saveBd() {
		int res = JOptionPane.showConfirmDialog(this,"Voulez-vous sauvegarder les données actuelles ?","Sauvegarde de la base",JOptionPane.YES_NO_CANCEL_OPTION);
		if (res == JOptionPane.YES_OPTION) {
			try {
				bd.Sauvegarde();
				return true;
			}
			catch(Exception ex){
				JOptionPane.showMessageDialog(this,ex.getMessage(),"Sauvegarde IMPOSSIBLE : Attention",JOptionPane.ERROR_MESSAGE);
				return false;
			}
		}
		else if(res == JOptionPane.NO_OPTION)
			return true;
		else
			return false;
	}
	
	private void ImportApoflux() {
		String filename="";
		JFileChooser c = new JFileChooser(BdImpl.CSVDIR);
		FileNameExtensionFilter filter = new FileNameExtensionFilter("CSV files", "csv");
		c.setFileFilter(filter);
		if (JFileChooser.APPROVE_OPTION == c.showOpenDialog(this))
			filename = c.getSelectedFile().getPath();
		else
			return;

		if (JOptionPane.OK_OPTION == JOptionPane.showConfirmDialog(this,"Les données nouvelles d'Apoflux vont être ajoutées à la base","Importation : Attention", JOptionPane.OK_CANCEL_OPTION))

			try {
				int num = bd.importeListeApoflux(filename);
				JOptionPane.showMessageDialog(this, num+" nouveaux dossiers importés", "Importation",JOptionPane.INFORMATION_MESSAGE);
			}
		catch(Exception ex){
			ex.printStackTrace();
			JOptionPane.showMessageDialog(this, ex.getMessage(),"Importation Apoflux IMPOSSIBLE : Attention",JOptionPane.ERROR_MESSAGE);
		}
	}

	private void OpDossier(Bd.Operation op) {
		String id = JOptionPane.showInputDialog(this,"ID Apoflux du dossier");
		if (!id.isEmpty())
			try {
				bd.OpDossier(id, op);
			} catch (Exception ex) {
				JOptionPane.showMessageDialog(this,ex.getMessage(),"Modification d'un dossier : Attention",JOptionPane.ERROR_MESSAGE);
				ex.printStackTrace();
			}
	}

	/**
	 * Create menus
	 */
	private void createMenus() {
		menuBar = new JMenuBar();
		////////////////////////
		JMenu fileMenu = menuBar.add(new JMenu("Gestion BD"));
		newbase = addMenuItem(fileMenu, "Nouvelle base", this);
		importApoflux = addMenuItem(fileMenu, "Importer Apoflux", this);
		fileMenu.addSeparator();
		save = addMenuItem(fileMenu, "Sauvegarder", this);
		restore = addMenuItem(fileMenu, "Restaurer derniere sauvegarde", this);
		restoreold = addMenuItem(fileMenu, "Restaurer une ancienne base", this);
		fileMenu.addSeparator();
		show_nb_clients = addMenuItem(fileMenu, "Nombre de clients connectés", this);
		fileMenu.addSeparator();
		quit = addMenuItem(fileMenu, "Quitter", this);
		///////////////////////////////
		JMenu bdMenu = menuBar.add(new JMenu("BD Master"));
		addMenuItem(bdMenu, "Liste des Parcours", new ParcoursAfficheAction(this));
		addMenuItem(bdMenu, "Liste des UEs", new UniteEnseignementAfficheAction(this));
		///////////////////////////////////
		JMenu pdfMenu = menuBar.add(new JMenu("PDF"));
		parcourspdf = addMenuItem(pdfMenu, "Parcours", this);
		parcourssynthesepdf = addMenuItem(pdfMenu, "Parcours (Synthèse)", this);
		UEsdetails = addMenuItem(pdfMenu, "UEs (détails)", this);
		UEssynthese = addMenuItem(pdfMenu, "UEs (synthèse)", this);
		stat = addMenuItem(pdfMenu, "Statistiques", this);
		demandes = addMenuItem(pdfMenu, "Demandes", this);
		evaluations = addMenuItem(pdfMenu, "Evaluations", this);
		propositions = addMenuItem(pdfMenu, "Propositions", this);
		pdfMenu.addSeparator();
		courriers = addMenuItem(pdfMenu, "Premiers courriers", this);
		courriers_suivants = addMenuItem(pdfMenu, "Courriers suivants", this);
		//////////////////////////////////////////////////
		JMenu mailMenu = menuBar.add(new JMenu("Emails"));
		mails = addMenuItem(mailMenu, "Les premiers emails", this);
		mails_suivants = addMenuItem(mailMenu, "Les emails suivants", this);
		relance_coupons = addMenuItem(mailMenu, "Relance par email coupons", this);
		/////////////////////////////////////////
		JMenu propMenu = menuBar.add(new JMenu("Proposition"));
		affect = addMenuItem(propMenu, "Première affectation", this);
		new_affect = addMenuItem(propMenu, "Nouvelle affectation", this);
		///////////////////////////
		JMenu AdminMenu = menuBar.add(new JMenu("Administration"));
		deldos = addMenuItem(AdminMenu, "Suppression d'un dossier", this);
		razdos = addMenuItem(AdminMenu, "Remise à zéro d'un dossier", this);
	}
//////////////////////
	private JMenuItem addMenuItem(JMenu menu, String label, ActionListener l) {
		JMenuItem item = new JMenuItem(label);
		item.addActionListener(l);
		menu.add(item);
		return item;
	}
///////////////
	public static void main(String[] argv){
		new GestionParcours();
	}
////////////////
	@Override
	public void actionPerformed(ActionEvent e){
		JMenuItem source = (JMenuItem)(e.getSource());
		//appuie sur quitter
		if(source == quit) {
			if(saveBd())
				System.exit(0);
		}
		if(source == save) {
			saveBd();
		}
		if(source == restore) {
			restaurerBd();
		}
		if(source == restoreold) {
			JFileChooser chooser = new JFileChooser(BdImpl.CSVDIR);
			FileNameExtensionFilter filter = new FileNameExtensionFilter("back files", "back");
			chooser.setFileFilter(filter);
			if(JFileChooser.APPROVE_OPTION == chooser.showOpenDialog(this)) {
					restaurerBd(chooser.getSelectedFile().getPath());
			}
		}
		if(source == newbase) {
			newBase();
		}
		if(source==importApoflux) {
			ImportApoflux();
		}
		if(source==show_nb_clients) {
			try {
				JOptionPane.showMessageDialog(this,"Il y a "+serveur.getNbClients()+" connectés","Nombre de clients",JOptionPane.INFORMATION_MESSAGE);
			} catch (Exception ex) {
				ex.printStackTrace();
				JOptionPane.showMessageDialog(this,ex.getMessage(),"Opération Impossible",JOptionPane.ERROR_MESSAGE);
		
			}
		}
		try {
			if(source==parcourspdf)
				bd.imprimer(Bd.Documents.PARCOURS);
			if(source==parcourssynthesepdf)
				bd.imprimer(Bd.Documents.PARCOURS_SYNTHESE);
			if(source==UEsdetails)
				bd.imprimer(Bd.Documents.UEs_DETAILS);
			if(source==UEssynthese)
				bd.imprimer(Bd.Documents.UEs_SYNTHESE);
			if(source==stat)
				bd.imprimer(Bd.Documents.STATISTIQUES);
			if(source==demandes)
				bd.imprimer(Bd.Documents.DEMANDES);
			if(source==evaluations)
				bd.imprimer(Bd.Documents.EVALUATIONS);
			if(source==propositions)
				bd.imprimer(Bd.Documents.PROPOSITIONS);
			if(source==courriers)
				bd.imprimer(Bd.Documents.COURRIERS);
			if(source==courriers_suivants)
				bd.imprimer(Bd.Documents.COURRIERS_SUIVANTS);
			}
		catch (Exception ex) {
			ex.printStackTrace();
			JOptionPane.showMessageDialog(this,ex.getMessage(),"Impossible d'éditer le pdf : ",JOptionPane.ERROR_MESSAGE);
		}
		try {
			if(source==mails)
				bd.EnvoyerEmails(true);
			if(source==mails_suivants)
				bd.EnvoyerEmails(false);
			if(source==relance_coupons)
				bd.OpDossier("", Bd.Operation.RELANCE);
		}
		catch (Exception ex) {
			ex.printStackTrace();
			JOptionPane.showMessageDialog(this,ex.getMessage(),"Envoi emails : Attention",JOptionPane.ERROR_MESSAGE);
		}
		if(source==deldos)
			OpDossier(Bd.Operation.DELETE);
		if(source==razdos)
			OpDossier(Bd.Operation.REINIT_DOSSIER);
		try {
			if(source==affect)
				bd.OpDossier("", Bd.Operation.AFFECTATION);
			if(source==new_affect)
				bd.OpDossier("", Bd.Operation.NOUVELLE_AFFECTATION);
		}
		catch (Exception ex) {
			ex.printStackTrace();
			JOptionPane.showMessageDialog(this,ex.getMessage(),"Affectation des dossiers : Attention",JOptionPane.ERROR_MESSAGE);
		}		
	}
}
